iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

連續30天學習C#和ASP.NET系列 第 21

Day21 - 經典小遊戲 - 1A2B

  • 分享至 

  • xImage
  •  

動手做做看

寫完了「經典小遊戲 - 終極密碼」,現在就來寫寫看「經典小遊戲 - 1A2B」吧!!!

遊戲基本規則:


  1. 隨機生成答案: 遊戲開始時,電腦會隨機生成一個包含4個數字的答案。
  2. 猜測: 玩家可以通過在控制台輸入4位數字來進行猜測。
  3. 提示: 根據玩家的猜測,計算出幾個A和B。A代表數字和位置都正確的數量,B代表數字正確但位置不對的數量。
  4. 繼續猜測: 玩家可以根據提示信息繼續猜測,直到猜中答案。如果猜中,遊戲結束會顯示獲勝,並告訴玩家答案是什麼,以及他們一共猜了多少次。
  5. 結束遊戲: 遊戲在玩家猜中答案後結束,或者玩家選擇退出遊戲。

https://ithelp.ithome.com.tw/upload/images/20231001/20162273UKc5qTKlp0.jpg

從工具箱中,依次拉入TextBox跟Button控制項,然後在屬性視窗中設定控制項屬性。


  1. 表單的 Text 為「1A2B遊戲」。
  2. 輸入答案的文字盒,Name 設為 txtInput,將屬性 MaxLength 設為 4,限制玩家只能輸入 4 個數字,Font 大小設為18pt。
  3. 顯示訊息的文字盒,Name 設為 txtOutput,將屬性 MultiLine 設為 true,以顯示多行;屬性 ReadOnly 設為 true,限制只能看並不能輸入;屬性 ScrollBar 設為 Both,以控制卷軸,Font 大小設為16pt。
  4. 按鈕「開始」、「確定」、「答案」、「重玩」、「結束」的 Name 分別設為 btnStart、btnEnter、btnAns、btnRest、btnClose,Text 的值如介面所示,Font 大小設為16pt。

1.「開始」按鈕


隨機產生4個不同的數字,利用線性搜尋法,逐一比對是否有重複的數字。

int[] ans = new int[4];
Random rand = new Random();
int count = 0;

private void btnStart_Click(object sender, EventArgs e)
{
    int i = 0;
    while (i < 4)
    {
        ans[i] = rand.Next(0, 10);

        bool same = false; // 假設未重複
        for (int j = 0; j < i; j++)
            if (ans[j] == ans[i])
            {
                same = true;
                break;
            }

        if (same) continue; //有重複的話,重新產生在 i 位置的數字
        i = i + 1; // 沒有重複,處理下一個位置的數字
    }
    txtInput.Enabled = true; // 啟動該控制項
}

💡 線性搜尋法:在資料列中從頭開始逐一的搜尋,一筆一筆的資料值與搜尋目標值做比對,直到找到為止。

2.「確定」按鈕


玩家輸入後,進行數字比對,判斷幾A幾B。

private void btnEnter_Click(object sender, EventArgs e)
{
    string input = txtInput.Text;
    count += 1; // 猜的次數加1
    string message = "第" + count + "次 : " + input + "------";

    int A = 0; int B = 0;
    for (int i = 0; i < 4; i++)
    {
        //將字串中的數字字符,轉換為對應的整數值,並將該值存儲在變數 num 中
        int num = input[i] - '0';

        bool isFound = false;

        int a; // 紀錄ans陣列中的位置

        for (a = 0; a < 4; a++)
        {
            if (ans[a] == num)
            {
                isFound = true;
                break;
            }
        }
        if (isFound) // 判斷位置對錯
        {
            if (i == a) A++;
            else B++;
        }
    }
    message += A + "A" + B + "B";

    if (A == 4)
    {
        txtOutput.Text += message + "\\r\\n" + "猜對了!!!";
        txtInput.Enabled = false;
        btnEnter.Enabled = false;
    }
    else txtOutput.Text += message + "\\r\\n";

    txtInput.Text = "";
    btnStart.Enabled = false;
}

3.「答案」按鈕


用 for 迴圈,串接 Ans 陣列中的數字,然後用MessageBox顯示。

private void btnAns_Click(object sender, EventArgs e)
{
    string output = "答案: ";
    for (int i = 0; i < 4; i++) output += ans[i];
    MessageBox.Show(output, "答案", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

4.「重玩」按鈕


啟動「開始」跟「確定」鈕,清除輸入的數字及提示資料,記錄的次數重設為0。

private void btnReset_Click(object sender, EventArgs e)
{
    btnStart.Enabled = true;
    btnEnter.Enabled = true;
    txtOutput.Text = "";
    txtInput.Text = "";
    count = 0;
}

5.「結束」按鈕


不想玩的時候,就可以點「結束」鈕,離開遊戲。

private void btnClose_Click(object sender, EventArgs e)
{
    this.Close();
}

執行の結果


https://ithelp.ithome.com.tw/upload/images/20231001/201622737Fkpmk3JkN.jpg

※以上資料如有錯誤請多指教

參考資料

書名:程式設計基本功與實務範例解析:使用C#(第三版)(附範例光碟)
【Day30】[演算法]-線性搜尋法Linear Search


上一篇
Day20 - 經典小遊戲 - 終極密碼
下一篇
Day22 - 介紹ASP.NET
系列文
連續30天學習C#和ASP.NET30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言